package com.chinamobile.datapush.demo.controller;

import com.chinamobile.datapush.demo.util.BodyObj;
import com.chinamobile.datapush.demo.util.Util;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.*;

import javax.crypto.BadPaddingException;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.NoSuchPaddingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

/**
 * @auther yangsichen
 * @date 2024/7/10 15:18
 * @Description 1.接收OneNET旧平台全局推送及规则引擎消息控制类。
 * <p>2.已过时，新创建产品时，直接使用新平台推送功能。使用ReceiveController接收。
 */
@RestController
@RequestMapping("/old")
@Deprecated
public class ReceiveOldController {
    private static final Logger logger = LoggerFactory.getLogger(ReceiveOldController.class);
    private static final String RETURN = "ok";
    @Value("${onenet.token}")
    private String TOKEN = "";//用户自定义token和OneNet推送配置里的token一致
    @Value("${onenet.aesKey}")
    private String AES_KEY = "";//aesKey和OneNet推送配置里的aesKey一致

    /**
     * 功能说明： URL&Token验证接口。如果验证成功返回msg的值，否则返回其他值。
     *
     * @param msg       验证消息
     * @param nonce     随机串
     * @param signature 签名
     * @return msg值
     */
    @GetMapping(value = {"/receive"})
    public String check(@RequestParam String msg,
                        @RequestParam String nonce,
                        @RequestParam String signature) {
        logger.info("token:{}",TOKEN);
        logger.info("receive check msg:{},nonce:{},signature:{}", msg, nonce, signature);
        Util.checkToken(msg, nonce, signature, TOKEN);
        return msg;
    }

    /**
     * 功能描述：第三方平台数据接收。<p>
     * <ul>注:
     * <li>1.OneNet平台为了保证数据不丢失，有重发机制，如果重复数据对业务有影响，数据接收端需要对重复数据进行排除重复处理。</li>
     * <li>2.OneNet每一次post数据请求后，等待客户端的响应都设有时限，在规定时限内没有收到响应会认为发送失败。
     * 接收程序接收到数据时，尽量先缓存起来，再做业务逻辑处理。</li>
     * <li>3.AES_KEY配置为空时为明文逻辑，不为空时视作密文传输做解密操作</li>
     * </ul>
     *
     * @param body 数据消息
     * @return 任意字符串。OneNet平台接收到http 200的响应，才会认为数据推送成功，否则会重发。
     */
    @PostMapping("/receive")
    public String receivePlain(@RequestBody String body) throws InvalidAlgorithmParameterException, NoSuchPaddingException, IllegalBlockSizeException, NoSuchAlgorithmException, BadPaddingException, InvalidKeyException {
        BodyObj obj = Util.resolveOldBody(body, !AES_KEY.isEmpty());
        logger.info("old data receive:  body Object ---,{}", obj);
        if (obj != null) {
            boolean dataRight = Util.checkSignature(obj, TOKEN);
            if (dataRight) {
                String msg =AES_KEY.isEmpty()? obj.toString() : Util.decryptOldMsg(obj.getMsg().toString(), AES_KEY);
                logger.info("old data receive: content {}", msg);
            } else {
                logger.info("old data receive: signature error");
            }

        } else {
            logger.info("old data receive: body empty error");
        }
        return RETURN;
    }
}
